//package com.platform.minio;
//
//import com.platform.ObjectStorage;
//import io.minio.*;
//import io.minio.messages.Bucket;
//import io.minio.messages.Item;
//import lombok.RequiredArgsConstructor;
//import lombok.SneakyThrows;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.factory.InitializingBean;
//import org.springframework.util.Assert;
//
//import java.io.InputStream;
//import java.time.LocalDateTime;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Optional;
//
///**
// * @author liujizheng
// * @version 1.0
// * @ClassName MinioTemplate
// * @Description minio 操作模板
// * @date 2021/7/21 9:51
// */
//@RequiredArgsConstructor
//public class MinioTemplate implements ObjectStorage, InitializingBean {
//    /**
//     * minio url
//     */
//    private final String endpoint;
//    /**
//     * minio access key
//     */
//    private final String accessKey;
//    /**
//     * minio secret key
//     */
//    private final String secretKey;
//    /**
//     * minio client
//     */
//    private MinioClient client;
//    /**
//     * 未指定桶时，默认桶名称
//     */
//    public static final String DEFAULT_BUCKET = "default.bucket";
//    /**
//     * 点
//     */
//    private static final String DOT = ".";
//
//    /**
//     * 获取uuid
//     */
//    private static final String UUID = uuid();
//
//    private static final String uuid() {
//        return java.util.UUID.randomUUID().toString().replace("-", "");
//    }
//
//    /**
//     * 创建bucket
//     *
//     * @param name bucket名称
//     */
//    @SneakyThrows
//    public void createBucket(String name) {
//        BucketExistsArgs args = BucketExistsArgs.builder().bucket(name).build();
//        MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(name).build();
//        if (!client.bucketExists(args)) {
//            client.makeBucket(makeBucketArgs);
//        }
//    }
//
//    /**
//     * 获取全部bucket
//     * <p>
//     * https://docs.minio.io/cn/java-client-api-reference.html#listBuckets
//     */
//    @SneakyThrows
//    public List<Bucket> getAllBuckets() {
//        return client.listBuckets();
//    }
//
//    /**
//     * 根据bucketName获取信息
//     * @param name bucket名称
//     */
//    @SneakyThrows
//    public Optional<Bucket> getBucket(String name) {
//        return client.listBuckets().stream().filter(b -> b.name().equals(name)).findFirst();
//    }
//
//    /**
//     * 根据bucketName删除信息
//     * @param name bucket名称
//     */
//    @SneakyThrows
//    public void removeBucket(String name) {
//        client.removeBucket(RemoveBucketArgs.builder().bucket(name).build());
//    }
//
//    /**
//     * 根据文件前置查询文件
//     *
//     * @param name       bucket名称
//     * @param prefix     前缀
//     * @param recursive  是否递归查询
//     * @return MinioItem 列表
//     */
//    @SneakyThrows
//    public List<Item> getAllObjectsByPrefix(String name, String prefix, boolean recursive) {
//        List<Item> objectList = new ArrayList<>();
//        Iterable<Result<Item>> objectsIterator = client.listObjects(ListObjectsArgs.builder()
//                .bucket(name).prefix(prefix).recursive(recursive).build());
//
//        while (objectsIterator.iterator().hasNext()) {
//            objectList.add(objectsIterator.iterator().next().get());
//        }
//        return objectList;
//    }
//
//    /**
//     * 获取文件外链
//     *
//     * @param bucketName bucket名称
//     * @param objectName 文件名称
//     * @param expires    过期时间 <=7
//     * @return url
//     */
//    @SneakyThrows
//    public String getObjectUrl(String bucketName, String objectName, Integer expires) {
//        return client.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
//                .bucket(bucketName).object(objectName).expiry(expires).build());
//    }
//
//    /**
//     * 获取文件
//     *
//     * @param bucketName bucket名称
//     * @param objectName 文件名称
//     * @return 二进制流
//     */
//    @SneakyThrows
//    public InputStream getObject(String bucketName, String objectName) {
//        return client.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
//    }
//
//    /**
//     * 上传文件
//     *
//     * @param bucketName bucket名称
//     * @param objectName 文件名称
//     * @param stream     文件流
//     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#putObject
//     */
//    public void putObject(String bucketName, String objectName, InputStream stream) throws Exception {
//        client.putObject(PutObjectArgs.builder().bucket(bucketName)
//                .object(objectName).stream(stream, stream.available(), -1)
//                .contentType("application/octet-stream").build());
//    }
//
//    /**
//     * 上传文件
//     *
//     * @param bucketName  bucket名称
//     * @param objectName  文件名称
//     * @param stream      文件流
//     * @param size        大小
//     * @param contextType 类型
//     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#putObject
//     */
//    public void putObject(String bucketName, String objectName, InputStream stream, long size, String contextType) throws Exception {
//        client.putObject(PutObjectArgs.builder().bucket(bucketName)
//                .object(objectName).stream(stream, size, -1)
//                .contentType(contextType).build());
//    }
//
//    /**
//     * 获取文件信息
//     *
//     * @param bucketName bucket名称
//     * @param objectName 文件名称
//     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#statObject
//     */
//    public StatObjectResponse getObjectInfo(String bucketName, String objectName) throws Exception {
//        return client.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
//    }
//
//    /**
//     * 删除文件
//     *
//     * @param bucketName bucket名称
//     * @param objectName 文件名称
//     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#removeObject
//     */
//    public void removeObject(String bucketName, String objectName) throws Exception {
//        client.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
//    }
//
//    @Override
//    public void afterPropertiesSet() throws Exception {
//        Assert.hasText(endpoint, "Minio url 为空");
//        Assert.hasText(accessKey, "Minio accessKey为空");
//        Assert.hasText(secretKey, "Minio secretKey为空");
//        this.client = MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();
//    }
//
//    /**
//     * 对象上传
//     *
//     * @param is     对象流
//     * @param suffix 文件后缀
//     * @return 返回存储对象的id
//     */
//    @SneakyThrows
//    @Override
//    public String upload(InputStream is, String suffix) {
//        // 上传文件名处理
//        String filename = UUID;
//        if (suffix.startsWith(DOT)) {
//            filename += suffix;
//        } else {
//            filename += DOT + suffix;
//        }
//
//        // 不再支持创建包含大写字母或下划线的bucket名称
//        createBucket(DEFAULT_BUCKET);
//        // 文件存储路径处理，根据时间，尽量让上传文件正态分布
//        LocalDateTime time = LocalDateTime.now();
//        String hex = Integer.toHexString(time.hashCode()).toUpperCase();
//        String tmp = StringUtils.rightPad(hex, 8, '0');
//        // + "/" + tmp.substring(6, 8);
//        String path = tmp.substring(0, 2) + "/" + tmp.substring(2, 4) + "/" + tmp.substring(4, 6);
//
//        String objectName = path + "/" + filename;
//        putObject(DEFAULT_BUCKET, objectName, is);
//
//        return objectName;
//    }
//
//    /**
//     * 对象下载
//     *
//     * @param fileId 对象id
//     * @return 返回存储对象的流
//     */
//    @Override
//    public InputStream download(String fileId) {
//        return getObject(DEFAULT_BUCKET, fileId);
//    }
//}
